export const getInputs = () => [
	[['2', '1', '+', '3', '*']],
	[['4', '13', '5', '/', '+']],
	[['10', '6', '9', '3', '+', '-11', '*', '/', '*', '17', '+', '5', '+']],
];

/**
 * **[150. 逆波兰表达式求值](https://leetcode.cn/problems/evaluate-reverse-polish-notation/)**
 *
 * 给你一个字符串数组 `tokens` ，表示一个根据 [逆波兰表示法](https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437) 表示的算术表达式。
 *
 * 请你计算该表达式。返回一个表示表达式值的整数。
 *
 * **注意：**
 * - 有效的算符为 `'+'`、`'-'`、`'*'` 和 `'/'` 。
 * - 每个操作数（运算对象）都可以是一个整数或者另一个表达式。
 * - 两个整数之间的除法总是 **向零截断** 。
 * - 表达式中不含除零运算。
 * - 输入是一个根据逆波兰表示法表示的算术表达式。
 * - 答案及所有中间计算结果可以用 **32 位** 整数表示。
 *
 * @param tokens
 * @returns
 */
export default function (tokens: string[]): number {
	const stack: number[] = [];

	const add = () => {
		const b = stack.pop();
		const a = stack.pop();
		stack.push(a! + b!);
	};
	const sub = () => {
		const b = stack.pop();
		const a = stack.pop();
		stack.push(a! - b!);
	};
	const mul = () => {
		const b = stack.pop();
		const a = stack.pop();
		stack.push(a! * b!);
	};
	const div = () => {
		const b = stack.pop();
		const a = stack.pop();
		stack.push(~~(a! / b!));
	};

	for (const shift of tokens) {
		switch (shift) {
			case '+':
				add();
				break;
			case '-':
				sub();
				break;
			case '*':
				mul();
				break;
			case '/':
				div();
				break;
			default:
				stack.push(Number(shift));
		}
	}

	return stack[0];
}
